home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 32
/
Aminet 32 (1999)(Schatztruhe)[!][Aug 1999].iso
/
Aminet
/
comm
/
ums
/
UMS11_9_beta.lha
/
UMS
/
Developer
/
doc
/
ums.doc
Wrap
Text File
|
1999-06-12
|
83KB
|
2,310 lines
TABLE OF CONTENTS
ums.library/--background--
ums.library/--loginguide--
ums.library/--message-format--
ums.library/--attributes--
ums.library/UMSCannotExport
ums.library/UMSDeleteMsg
ums.library/UMSDupAccount
ums.library/UMSErrNum
ums.library/UMSErrTxt
ums.library/UMSErrTxtFromNum
ums.library/UMSExportedMsg
ums.library/UMSFreeConfig
ums.library/UMSFreeMsg
ums.library/UMSLog
ums.library/UMSLogin
ums.library/UMSLogout
ums.library/UMSMatchConfig
ums.library/UMSReadConfig
ums.library/UMSReadMsg
ums.library/UMSRLogin
ums.library/UMSSearch
ums.library/UMSSelect
ums.library/UMSServerControl
ums.library/UMSWriteConfig
ums.library/UMSWriteMsg
ums.library/--background-- ums.library/--background--
$VER: 11.29 (11-Jun-95)
COPYRIGHT
This document is (C) 1992-1995 by Martin Horneffer, Olaf Peters,
Christoph Viethen, and Stefan Becker.
It may freely be copied and distributed, as long as the text is
unchanged and this copyright notice is left intact.
GENERAL
UMS stands for "Universal Message System".
This means that UMS allows to treat and read all kinds of
messages ('e-mail' and 'news') as universally and efficiently as
possible.
The user should not need to care about what network a message
comes from or goes to/through and what format is used, he or she
should be able to concentrate totally on the messages' contents.
In order to achieve this goal, UMS does two things:
1) define an universal format for messages where messages in all
formats and from all networks can be stored in without loss of
information and nevertheless being randomly interchangeable.
This universal message format is described in this document in
section "--message-format--".
2) implement a central, network-independent database-mamagement
that allows to store and read/retrieve messages in the UMS format
as efficiently as possible.
The implementation of the Message Base Processor ('MBP') is
based on the server/client- concept. Clients address the server to
get or put messages. The server manages the storage and retrieval
of messages and controls the different client's access-rights to
the system. The common interface between client and server is a
set of functions described in this document.
Clients are
- simple USERS that read and write messages (using programs
called 'newsreaders'),
- a special kind of user, the 'SYSOP', which has additional
rights and tools to manage the system,
- IMPORTERS, that get messages form other systems and put them
into the local system after converting them to the UMS format,
and
- EXPORTERS, that look for all NEW messages in the system and
send them to other systems after converting them into the
specific format.
The MBP controls which user may read what message and, in the
same way, which exporter needs to export or forward what message.
It cares about whether a message can or cannot be correctly sent
to its destination.
The MBP also performs dupe-checking and reply-chaining on
Message-IDs.
TAGS
UMS extensively uses AmigaDOS-style tags (see: utility.library).
In addition to the AmigaDOS standard, UMS uses some bit-masking in
the types of tags:
- if bit 13 is set (tag & 0x2000), the tag data is a STRPTR,
i.e. a pointer to a null-terminated string.
- if bit 14 is set (tag & 0x4000), the tag is considered a 'var-
parameter' (e.g. LONG *). I.e. the tag.data entry must contain
a pointer to the real data, which will be set/changed by the
called function.
- if both bits 13 and 14 are set ((tag & 0x6000)==0x6000), the
tag is a pointer to a string pointer which will be set/changed
(STRPTR *).
- if none of these bits is set, the data in most cases is a
simple integer parameter (e.g. LONG or LONGBITS). Exceptions
are possible and explicitly mentioned.
ums.library/--loginguide--
PURPOSE
Guidelines on a uniform login-procedure in UMS-applications
NOTE
Suggestions concerning this section of the document should be
directed to Olaf Peters <op@hb2.maus.de>
GENERAL
Shell- & Workbench-startup
An application should take into account the command line
arguments (Shell) respectively Workbench tooltypes 'NAME',
'PASSWORD' and 'SERVER'. Concerning invokation from a Shell, the
order of arguments should match above example, with 'SERVER'
declared a keyword (resulting in a command template beginning
"NAME,PASSWORD,SERVER/K[,...]").
SHELL
Invocation from Shell:
If the application is passed a questionmark as the only argument
on the command line (i.e. 'UMSapp ?'), it should return the
template to stdout and offer a prompt to have the user enter the
desired options. The user should be able to request additional
help by responding to the prompt with another questionmark.
Additional help consists of complete version information (at least
a standard version template as specified in "Amiga User Interface
Styleguide" (pp. 110)) accompanied by short help information.
Technical realisation: DOS.ReadArgs() provides a standard means
to parsing the command line and behaves exactly in the above
described manner (it should therefore be used). Additional help
text can be passed to ReadArgs() by supplying a custom RDArgs
structure as third argument which holds a pointer to the text
string in RDA_ExtHelp. Refer to "The AmigaDOS Manual", Chapter 5,
Basic Input and Output Programming, Standard Command Line Parsing
(pp. 181 as of the 3rd edition)
GUI
Applications allowing login via GUI (graphical user interface):
If 'NAME' is not specified at startup time, it must be entered
to the login window. Activate the name object.
It is legal to pass an empty 'PASSWORD' as long as a name is
specified. Thus the empty password must attempt a login! If the
user passes the period (".") as 'PASSWORD', she desires to enter
her password to the login window. It should open with the password
object activated.
If there is no 'SERVER' specified and the login window must be
opened due to the above guidelines, the server object should be
filled with the name of the default server (i.e. the server to
which the user would be going to log in to if she was not naming a
different one herself). The default server's name can be read from
the ENV $UMSSERVER. If the ENV does not exist, the default name is
"default". :-)
A failed GUI login should be answered in a requester. After
confirmation the user should be presented with the unmodified
login window again as to correct her wrong inputs. Cancelling the
requester should result in terminating the application.
ums.library/--message-format-- ums.library/--message-format--
NAME
UMS Message Format -- the universal format of UMS messages
NOTE
Suggestions concerning this section of the document should be
directed to Christoph Viethen <cv@nostlgic.oche.de>.
GENERAL
A message in the UMS message base is always defined by a list of
tags. This allows for easy extension as new tags may always be
defined later on.
In one UMS message, each tag may occur only once.
TEXT TAGS
The first part of this section describes the format of the
currently defined TEXT-tags. Currently these tags include all
information that is site-independend and needed when transferring
messages between different systems.
Except when explicitly stated otherwise, these tags are network-
independent. Drivers for all networks can and must understand
them.
A text-tag specifies a null-terminated string of any length. All
ASCII-characters are allowed. Unless something else is documented
for a specific tag, the standard Amiga charset (ISO 8859 Latin 1)
is used for 8-bit characters.
Some of the text-tags are required for every message, others are
optional.
0. UMSCODE_MsgText
This contains the main 'text' of a message. Every message must
have this tag as it is usually the main information transported by
a message.
Any information that does not belong to the original text must
not be put here. Even when a gateway between two different
networks puts information in the text, an UMS importer should - if
possible - extract this information and use or store it somewhere
else.
The text may be of any size, even empty.
By using the global ums.config item "Maxmsgsize" you can set a
size limit. Attempting to _write_ messages larger than this into
the message base will fail. (This limit does not affect the size
of messages already in the message base. If you, say, write a
message of 500K into the MB and then set "Maxmsgsize" to 300000
(bytes), there shouldn't be any problems when making read accesses
to this message.)
Since some networks limit messages to a certain size, drivers
for these networks must be able to cope with this situation.
Lines are delimited by the standard line delimiter (LF in the
current UMS implementation), no matter, what network the specific
messages originate from and what kind of line delimiters are used
there.
Lines may be of any length, so it's up to the newsreader or
exporter to wrap lines if needed.
1. UMSCODE_FromName
This is the name of the message's author. It's only the name and
NOT the address. This should be the REALNAME!
If there is no realname, the username must be used or extracted
from the author's address.
Every message must have this tag.
2. UMSCODE_FromAddress
This is the author's net-address. The name needn't redundantly
be repeated in this field, if it's already in UMSCODE_FromName.
This tag must be empty or the tag must not be specified, if the
author is located on the local system. In every other case, this
tag is mandatory.
Whenever possible, the address should be the user's real address
and not an encapsulated address or the address of a gateway. Thus
it may be necessary for importers to convert received addresses to
another network's format. The corresponding exporters, of course,
have to be able to re-convert these addresses. This makes the use
of gateways transparent to the user - one of UMS' most important
features. It saves the user from having to know and worry about
the formats of all the gateways himself.
Since there are different networks with different formats of
addresses, it's neccessary to distinguish these different formats.
This is done by looking at the "tail" of the address. The
following formats are currently known:
Identifier : network/format
----------------------------------------------------
"@Fidonet" : FidoNet
".maus" : MausNet
".org", ".edu", ".UUCP", ".net",
".de", .. [any valid usenet domain] : RFC
"@BIX" : BIX
"@Portal" : Portal
Important note:
Under certain circumstances, other identifiers may be used:
1) Small networks: Quite a few of them use adresses which
look like FidoNet-Adresses, but contain a different "zone
number". For practical reasons, messages from such networks
may be imported into the UMS message base using an identifier
other than "@Fidonet". So you may encounter addresses like e.g.
"21:100/1.0@Gernet" in the MB.
2) There are special-purpose applications, like e.g. QWK im-/
exporters(?), which could use other kinds of identifiers not
contained in the above table.
So programmers of UMS applications should keep the following in
mind:
Any UMS tool should be programmed in such a way that it does not
break if it encounters unknown network identifiers and/or formats.
In such cases, it should inform the user of the problem and behave
"neutrally", e.g. ignore the problematic message. UMS tools should
never rely on somewhat adventurous "address format guessing"
methods.
On the other hand, if you plan to write a tool that will import
messages into the MB with address formats different to the ones
mentioned in the above table, you are _strongly_ advised to
contact authors of other UMS applications, especially the
developers of the UMS im-/exporters, in order to avoid
incompatibility problems right from the start.
Examples:
a) Fidonet 2:2452/107.9@Fidonet
2:242/53@Fidonet
b) MausNet AC2.maus
MS.maus
MK2.maus
M.maus
c) RFC maho@dfv.rwth-aachen.de
marvin@tornado.oche.de
in-info@individual.net
postmaster@germany.uucp
peterk@cbmger.de.so.commodore.com
Network-identifiers are NOT case-sensitive. Nevertheless, you
always should preserve case, as it might be needed by some
networks.
Historical note:
Some time ago, a special address format was used in the
german "Z-Netz", and its identifier was ".zer". That format
had a number of limitations and disadvantages, so a new
mail format called "ZConnect" was developed and now should
be used by all Z-Netz members. This new format no longer
needs any special address identifiers since it uses real RFC
addresses.
So the identifier ".zer" mentioned in the V10 version of
this documentation shouldn't be treated in a special way
by programs using ums.library any more.
Some examples for splitting addresses for 'Name' and 'Address':
RFC:
"Martin Horneffer <maho@umshq.dfv.rwth-aachen.de>"
-> name: "Martin Horneffer"
address: "maho@umshq.dfv.rwth-aachen.de"
"horneff@pool.informatik.rwth-aachen.de (Martin Horneffer)"
-> name: "Martin Horneffer"
address: "horneff@pool.informatik.rwth-aachen.de"
"horneff@pool.informatik.rwth-aachen.de"
-> name: "horneff"
address: "horneff@pool.informatik.rwth-aachen.de"
FidoNet:
"Martin Horneffer at 2:242/7.9"
-> name: "Martin Horneffer"
address: "2:242/7.9@Fidonet"
"Joerg Gutzke at 2:242/7"
-> name: "Joerg Gutzke"
address: "2:242/7@Fidonet"
3. UMSCODE_ToName
Name of the person the message is addressed to.
Must be specified in all private messages ("e-mail") and is
optional in public messages ("news").
4. UMSCODE_ToAddress
The addressed person's network address.
Needed in private messages if the message has not yet reached
its destination. Must not be used when the mail is addressed to a
user on the local system.
UMSCODE_ToName and UMSCODE_ToAddress have exactly the same
format as UMSCODE_FromName and UMSCODE_FromAddress.
It should always be possible to reply to a private or public
message by using it's FromName and FromAddress as the new ToName
and ToAddress.
5. UMSCODE_MsgID
A unique message ID in RFC-format. This is valid also for
non-RFC networks like FidoNet or MausNet!
Every message must have such an ID. If there's no ID for a
message, the message base processor will create a new one for this
message. Never create message IDs on your own!
Some example message ID's, just to give you an idea what IDs
from RFC and non-RFC systems may look like within UMS:
2pocc6$qf2@Germany.EU.net
295@lyssa.owl.de (generated by RFC systems)
91102312@p27.f107.n2452.z2.fidonet.org (generated by a Fido "point")
51515153@f7.n242.z2.fidonet.org (generated by a "non-point")
199409281223.a27374@hro.maus.de (generated in MausNet)
6. UMSCODE_CreationDate
(Optional) date of creation, i.e. when the message has been
written by the user. May be in any format that is readable by
humans. AmigaDOS format (dd-mmm-yy hh:mm:ss) preferred.
If not set, then the message base processor will use the current
date to create a date string in AmigaDOS format.
7. UMSCODE_ReceiveDate
Obsolete. Don't use any more! As a replacement there is a tag
for a site-specific binary date.
8. UMSCODE_ReferID
(Optional) message ID of the most recent message that is
referred to by the current message. Same format as 'MsgID'.
9. UMSCODE_Group
Name of the message's newsgroup.
Must be used for public messages only. Must not be used for
private mail. This tag is the only one that distinguishes private
from public messages.
To avoid possible conflicts, the name of the network must be
prepended for non-usenet groupnames. Usenet groupnames, which
already are hierarchically ordered, stay as they are.
E.g. "fidonet.AMIGA", "maus.ac.amiga", "comp.sys.amiga.misc".
Only one group may be used in this field! Use 'Hardlinks' for
"crosspostings".
10. UMSCODE_Subject
The (short) subject of the message. Required.
11. UMSCODE_Attributes
(Optional) List of keywords. See ums.library/--attributes--
12. UMSCODE_Comments
(Optional) all "header-"information, that belong to a message
and must be preserved, but don't fit to another text-tag. E.g. all
unknown RFC-header lines go here.
The first line should specify the name of networks the message
comes from and the name (and perhaps version) of the importer.
13. UMSCODE_Organization
(Optional) sender's organization or, in FidoNet, "Origin".
14. UMSCODE_Distribution
(Optional) where/what the message should be distributed to/by.
Much like RFC-"Distribution:".
Could e.g. be used to select which UMS-Exporter should export
the respective message if the ums.config is set accordingly.
15. UMSCODE_Folder
(Written by receiver) The receiver of a private message may use
this field to store a short label in (not more than about 30
chars, not more than one line). This allows him to categorize
received messages. Newsreaders may allow to change that field for
private messages and then to use these categories or 'folders'
like 'groups' in public messages.
17. UMSCODE_MausID
This is specific to MausNet.
It should thus be ignored by all programs not specifically
dealing with MausNet. It's used to store the internal MausNet-ID.
It will become superfluous when MausNet software learns to deal
with real Message-IDs.
18. UMSCODE_ReplyGroup
(Optional) name of the group public replies ("follow-ups")
should go to. Ergo: Same purpose as "Followup-To:" in RFC1036.
If not empty, newsreaders should copy this to the UMSCODE_Group
field of the new message when writing a (public) follow-up.
Otherwise keep the old UMSCODE_Group field.
Same format as for field UMSCODE_Group, except that, if the
author of the public message thinks that public replies should go
into several groups (as a "crossposting"), he may enter a list of
groups, seperated by commas, into this field.
Exception to all of this: If this field contains the string
"poster", this expresses the poster's wish to get a private reply.
Newsreaders and similar UMS tools should behave accordingly.
19./20. UMSCODE_ReplyName/UMSCODE_ReplyAddress
(Optional) name and address of the user private replies should
go to. Same purpose as "Reply-To:" in RFC822.
If not empty, newsreaders should copy these to the 'ToName' and
'ToAddress'-fields of the new message when writing a private
reply. Otherwise 'FromName' and 'FromAddress' should be used.
Same format as for 'ToName' and 'ToAddress'.
21./22. UMSCODE_LogicalToName/UMSCODE_LogicalToAddress (V11)
These fields are needed in UMS systems involved in automatic
mail distribution/forwarding, mailing lists e.g.
Under such conditions, it may be necessary to differenciate
between "physical" and "logical" addresses. While physical
addresses describe the systems messages are indeed transported
between, logical addresses describe what origin and destination
the original author intended for his mail.
If these fields are used, the fields UMSCODE_ToName and
UMSCODE_ToAddress contain the respective physical address.
These fields are optional - and usually not needed.
23. UMSCODE_FileName (V11)
(Optional) UMS supports the notion of "attached files". Binary
files may be attached to each message. If so, this field contains
the logical names of all attached files. To get the separated file
names call UMSReadMsg with the tag RNextFileName for every file.
No assumptions are made concerning the style of the logical
filename.
To attach more than one file to a message call UMSWriteMsg with
one tag WFileName for every file.
24. UMSCODE_RFCMsgNum (V11)
Private field for an NNTP daemon service or UUNEWS: emulator.
32. UMSCODE_FidoText
This is specific to FidoNet.
It should thus be ignored by all programs not specifically
dealing with FidoNet. It's used by FidoNet drivers to avoid loss
of informa- tion due to conversions of eol-delimiters or charsets.
33. UMSCODE_ErrorText
This is private to the MBP and a very special utility called
'bounce-daemon'. It is used to transfer an error-text for writing
bounce-mails. No programs except of the 'bounce-daemon' should
deal with it.
34. UMSCODE_Newsreader
(Optional) name and version of the tool the message was created
with. No specific format, but should be as small as possible. Not
more than one line.
35. UMSCODE_RfcAttr
Private field for RFC exporters. The user can supply additional
information or hints to the exporter.
36. UMSCODE_FtnAttr
Private field for FTN exporters. The user can supply additional
information or hints to the exporter.
37. UMSCODE_ZerAttr
Private field for Z-Netz exporters. The user can supply
additional information or hints to the exporter.
38. UMSCODE_MausAttr
Private field for Maus exporters. The user can supply additional
information or hints to the exporter.
127. UMSCODE_TempFileName (V11)
(Optional) This tag is related to UMSCODE_FileName. If files are
attached to the message, this field contains the "temporary" names
of the all attached files. To get the separated file names call
UMSReadMsg with the tag RNextTempFileName for every file. The
names have only a local meaning and may be different when reading
and writing.
When writing the message, the client must supply the file with
this temporary filename and the MBP must be able to read it. To
attach more than one file to a message call UMSWriteMsg with one
tag WTempFileName for every file.
When reading the message, the MBP supplies the name to a file
the client may read.
The contents of this field could be equal to UMSCODE_FileName,
but don't need to. Client as well as MBP have to use suitable path
in the filesystem, and specify the full pathname.
ums.library/--attributes-- ums.library/--attributes--
NOTE
Suggestions concerning this section of the document should be
directed to Stefan Becker <stefanb@yello.ping.de>.
BUGS
This section is still in German. Should be English.
24-Sep-1994
Das Format des UMS Feldes "Attributes"
Das UMS Feld "Attributes" enthält zusätzliche Informationen zu
einer Nachricht. Diese Informationen können von den Importern,
aber auch von den Benutzern mit Hilfe der Message Reader erzeugt
werden. Ein Importer darf allerdings keine netzspezifischen Daten
aus der Nachricht für den Exporter des gleichen Netzes in diesem
Feld ablegen. Dafür ist das Feld "Comments" vorgesehen.
Dieser Text soll das Format dieses Feldes vereinheitlichen,
damit das Feld von allen Programmen gleich ausgewertet wird. Das
Feld besitzt das gleiche Format wie eine Kommandozeile, d.h. es
läßt sich mit Hilfe der Funktion dos.library/ReadArgs() auswerten.
Es sind folgende Argumenttypen zugelassen:
/K - Zeichenkette mit Schlüsselwort
/K/N - Zahl mit Schlüsselwort
/S - Schalter mit Schlüsselwort
Importer können private Schlüsselworte benutzen, um
Informationen über den Status einer Nachricht an den Exporter des
gleichen Netzes weiterzureichen. Die privaten Schlüsselwörter
dürfen nicht mit den öffentlichen Schlüsselwörtern kollidieren.
Damit ein Exporter für ihn unbekannte Schlüsselwörter ignorieren
kann, hängt er ",IGNORE/M" an das Template für
dos.library/ReadArgs() an. Momentan werden folgende öffentliche
Schlüsselworter unterstützt:
ALIAS/K (nur lokal erzeugte Nachrichten)
Die Zeichenkette gibt an, welchen Alias der Benutzer für diese
Nachricht benutzen möchte. Ein Exporter _MUSS_ überprüfen, ob
dieser Alias auch zu dem Benutzer gehört, der die Nachricht
geschrieben hat!
RECEIPT/S
Dieses Attribut zeigt an, daß diese Nachricht eine Antwort auf
einen Receipt-Request ist.
RECEIPT-REQUEST/K <addr>
Für diese Nachricht liegt ein Receipt-Request des Absenders
vor. Falls die Nachricht beim System des Empfängers angekommen
ist, dann sollte der Importer eine Benachrichtigung an <addr>
zurückschicken.
SECURE/S
Wenn dieses Attribut gesetzt ist, dann soll die Nachricht bei
der Übertragung besonders geschützt werden. Der Exporter sollte
eine gesicherte Übertragungsstrecke wählen. Falls diese nicht
zur Verfügung steht, dann sollte der Nachrichtentext
verschlüsselt werden, z.B. durch PGP mit den Empfängeradressen
als Parameter.
URGENT/S
Mit diesem Attribut werden "eilige" Nachrichten markiert.
Exporter sollten, falls möglich, diese Nachrichten gesondert
behandeln.
ums.library/UMSCannotExport ums.library/UMSCannotExport
NAME
UMSCannotExport -- Mark a message as not being exportable.
SYNOPSIS
UMSCannotExport( login, msgNum, error )
D2 D3 D4
VOID UMSCannotExport( UMSAccount, LONG, STRPTR );
FUNCTION
Tell the MBP that you cannot export this message, due to any
reason. The MBP will then look if other exporters still could be
able to export the message or do some error processing otherwise.
It may use the supplied error-string therein. This error-string
should be a short description why the message could not be
exported. By convention it should not be longer than 80 bytes.
INPUTS
login - Handle as returned by UMSLogin() or UMSRLogin()
msgNum - Number of the message.
error - Short string (<80 chars).
NOTES
This function may only be called by exporters.
The MBP currently does not write a bounce mail to the author of
the mail, but sets a special global bit instead, which would
allows the 'bouncer' tool to automatically write bounce mails.
SEE ALSO
UMSExportedMsg()
ums.library/UMSDeleteMsg ums.library/UMSDeleteMsg
NAME
UMSDeleteMsg -- Delete a message.
SYNOPSIS
success = UMSDeleteMsg( login, msgNum )
D0 D2 D3
BOOL UMSDeleteMsg( UMSAccount, LONG);
FUNCTION
This functions deletes a message, specified by number, from the
UMS MB.
It does not necessarily free space on the hd, but it removes the
message logically from the MB so that no other user can access it
anymore and it won't affect the dupe-check for new messages.
The MBP may need reorganization to physically remove logically
deleted messages.
INPUTS
login - Handle as returned by UMSLogin() or UMSRLogin()
msgNum - Number of the message to be deleted. As returned by
UMSSearch() or WriteUMSMsg().
RESULT
success - Inidcates whether the message was actually deleted or
not. It will be not deleted if you don't have
write-access to this message or the message doesn't
exist.
NOTES
The number of a message is valid only as long as you are logged
in. After UMSLogout() messages numbers may change!
So you always have to use the real Message-ID to remember a
message persistently.
ums.library/UMSDupAccount ums.library/UMSDupAccount
NAME
UMSDupAccount -- share a login handle between processes
SYNOPSIS
login = UMSDupAccount(login)
D0 D2
UMSAccount UMSDupAccount(UMSAccount);
FUNCTION
UMSDupAccount() allows to share login handles to be shared
between different processes.
A login handle as returned by UMSRlogin() may only be used in
the same process that obtained the login. If it wishes to share
this login with other processes, the handle has to be 'dupped':
the login handle is passed to the new process, which may _only_
use this login with UMSDupAccount(). If successfull, a new login
handle is returned, which (only!) can be used by the new process.
This procedure is required to manage process-specific resources
a login handle may depend on. It does _not_ create a new login on
the server. Most likely, the server will not be involved in this
procedure at all, it's all done on the client side. Each process
must UMSLogout() all login handles it obtained either from
UMSRLogin() or from UMSDupAccount(). The server only notices a
logout, when all login handles concerning that login are closed
with UMSLogout(). Order of login and logout, however, does not
matter. E.g. the first process may UMSLogout() and terminate,
while the new process ist still running and using a dupped login
handle. Obviously the login handle has to be active at the time
UMSDupAccount() is invoked, but it may be closed as soon as
UMSDupAccount() has returned.
INPUTS
login - Handle as returned by UMSLogin() or UMSRLogin()
RESULT
login - Handle number if successful or Zero on failure
SEE ALSO
UMSLogin(), UMSRLogin(), UMSLogout()
ums.library/UMSErrNum ums.library/UMSErrNum
NAME
UMSErrNum -- Return the number of the last error
SYNOPSIS
error = UMSErrNum(login)
D0 D2
UMSError UMSErrNum(UMSAccount);
FUNCTION
UMS functions usually return zero to indicate an error. When
this happens, this routine may be called to get a more specific
error code. By some means, this routine corresponds to an UMS
login as dos.library/IoErr() does to a DOS-process.
Possible UMS errors are:
0:
No error at all, the last UMS function call was successful.
100-199:
A slight error. The last functions call was not successful,
but may succeed if some slight changes will be made to its
parameters.
200-299:
A real error. The last function call was not successful at all
and should not be retried.
>300:
A severe error concerning the whole system, e.g. the server
has terminated. A program receiving such an error is recommended
to UMSLogout() and terminate as soon as possible.
INPUTS
login - Handle as returned by UMSLogin() or UMSRLogin()
RESULT
error - Error number
SEE ALSO
UMSErrTxt()
ums.library/UMSErrTxt ums.library/UMSErrTxt
NAME
UMSErrTxt -- Return a string describing the last error
SYNOPSIS
text = UMSErrTxt(login)
D0 D2
STRPTR UMSErrTxt(UMSAccount);
FUNCTION
When an UMS function fails and/or UMSErrNum() returns a nonzero
value, you should use this routine to get a brief English
description of the last error.
Interactive programs should display this text to the user.
Non-interactive programs should use this text in their logfile.
INPUTS
login - Handle as returned by UMSLogin() or UMSRLogin()
RESULT
text - Pointer to a constant string
NOTES
This is similiar to dos.library/Fault(), but it doesn't copy any
string, it just returns a pointer.
You may NEVER change the string returned by UMSErrTxt()!
SEE ALSO
UMSErrNum(), UMSErrTxtFromNum()
ums.library/UMSErrTxtFromNum ums.library/UMSErrTxtFromNum
NAME
UMSErrTxtFromNum -- Return a string describing the last error
SYNOPSIS
text = UMSErrTxtFromNum(error)
D0 D2
STRPTR UMSErrTxtFromNum(UMSError);
FUNCTION
When an UMS function not related to an UMSAccount returns an
nonzero value, you should use this routine to get a brief English
description of the last error.
Interactive programs should display this text to the user.
Non-interactive programs should use this text in their logfile.
INPUTS
error - UMS error code
RESULT
text - Pointer to a constant string
NOTES
This is similiar to dos.library/Fault(), but it doesn't copy any
string, it just returns a pointer.
You may NEVER change the string returned by UMSErrTxtFromNum()!
SEE ALSO
UMSErrTxt()
ums.library/UMSExportedMsg ums.library/UMSExportedMsg
NAME
UMSExportedMsg -- Mark a message as being successfully exported.
SYNOPSIS
UMSExportedMsg( login, msgNum )
D2 D3
VOID UMSExportedMsg( UMSAccount, LONG );
FUNCTION
Tells the MBP that a message has been successfully exported. The
MBP uses this information to prevent other exporters from wrongly
exporting this message a second time or writing a bounce message.
Every exporter that exports a message from the local UMS system
to any other system or network MUST call either UMSExportedMsg()
or UMSCannotExport() for each message it has processed. This is
valid for private messages as well as for public messages (news).
The MBP will decide what has to be done in any of these cases.
INPUTS
msgNum - Number of the exported message.
NOTES
This function may only be called by exporters.
SEE ALSO
UMSCannotExport()
ums.library/UMSFreeConfig ums.library/UMSFreeConfig
NAME
UMSFreeConfig - Free a string returned by UMSReadConfig()
SYNOPSIS
UMSFreeConfig( login, string)
D2 D3
void UMSFreeConfig( UMSAccount, STRPTR );
FUNCTION
Frees the buffer allocated for a string and returned by
UMSReadConfig(). After 'UMSFreeConfig(string)', 'string' will no
longer be valid.
INPUTS
login - Handle as returned by UMSLogin() or UMSRLogin()
string - string to be freed as returned by UMSReadConfig()
SEE ALSO
UMSReadConfig()
ums.library/UMSFreeMsg ums.library/UMSFreeMsg
NAME
UMSFreeMsg -- Free buffers associated with a certain message.
SYNOPSIS
UMSFreeMsg( login, msgNum )
D2 D3
UMSFreeMsg( UMSAccount, LONG );
FUNCTION
Frees all the buffers associated with a certain message.
ReadUMSMsg() allocates the buffers, this function frees them.
INPUTS
msgNum - number of the message previously read with ReadUMSMsg().
NOTES
With UMSFreeMsg() all STRPTRs obtained with ReadUMSMsg() that
are concerned with this certain message become invalid. You can
have multiple ReadUMSMsg() on the same message but only one
UMSFreeMsg().
SEE ALSO
UMSReadMsg()
ums.library/UMSLog ums.library/UMSLog
NAME
UMSLog -- Write an entry to the global UMS logfile
SYNOPSIS
UMSLog(login, level, format, ...)
D2 D4 D5 D6
void UMSLog(UMSAccount, LONG, STRPTR, ... );
UMSVLog(login, level, format, args)
D2 D4 D5 D6
void UMSVLog(UMSAccount, LONG, STRPTR, APTR);
FUNCTION
Write a short message to the UMS logfile, doing printf()-style
formatting on supplied parameters.
Rather than creating its own logfile, an application should use
this function to report its actions and/or errors. This makes it
easier for the user to get an overview on what is happening in his
system - he only has to look in ONE logfile.
UMSLog() uses a 'level' parameter to decide whether a message
should actually be written to the logfile or be ignored. The lower
this number, the more important is the message. Choose it as
follows:
1-4:
An ERROR. 1 = fatal error, 4 = recoverable error.
5-7:
General information or report.
8-9:
Information that is not useful for normal operation, but used
for debugging purposes.
Of course messages with high level values should appear more
frequently than those with low level values.
INPUTS
login - Handle as returned by UMSLogin() or UMSRLogin()
level - Number between 1 and 9
format - printf()-style format string. See exec.library/RawDoFmt()
for more information on formatting.
args - Arguments for the format string
SEE ALSO
exec.library/RawDoFmt()
ums.library/UMSLogin ums.library/UMSLogin
NAME
UMSLogin -- Obtain a login for access to the default message base
SYNOPSIS
login = UMSLogin(user, passwd)
D0 D2 D3
UMSAccount UMSLogin(STRPTR, STRPTR);
FUNCTION
This function does the same as UMSRLogin(), but you cannot
specify the message base. The default message base will be used
instead.
INPUTS
user - Name or 'alias' of an user
passwd - The password of the user. A pointer to the null-string is
allowed, NULL itself isn't.
RESULT
login - Handle number if successful or Zero on failure
EXAMPLE
UMSAccount login = UMSLogin("SysOp", "secret");
NOTE
Never forget to call UMSLogout()!
New programs should let the user specify the server to use and
thus use UMSRLogin() instead.
SEE ALSO
UMSLogout(), UMSRLogin()
ums.library/UMSLogout ums.library/UMSLogout
NAME
UMSLogout -- Close a login and free its resources
SYNOPSIS
UMSLogout(login)
D2
void UMSLogout(UMSAccount);
FUNCTION
Close a login obtained with UMSRLogin() and free all related
resources.
INPUTS
login - Handle as returned by UMSLogin() or UMSRLogin()
SEE ALSO
UMSLogin(), UMSRLogin()
ums.library/UMSMatchConfig ums.library/UMSMatchConfig
NAME
UMSMatchConfig -- Match a string against a config string.
SYNOPSIS
match = UMSMatchConfig( login, tags )
D0 D2 D3
BOOL UMSMatchConfig( UMSAccount, struct TagItem * );
match = UMSMatchConfigTags( login, tag1, ... )
BOOL UMSMatchConfigTags( UMSAccount, ULONG, ... );
FUNCTION
UMS has its unique mechanism for pattern-matching, which is used
by the MBP for determining different access-rights.
UMSMatchConfig() offers direct access to this pattern-matching
mechanism, including positive and negative config variables. A
taglist is used to specify the string to be matched as well as a
UMS configuriation string serving as a pattern.
INPUTS
The functions takes two mandatory tags:
MatchString (STRPTR)
specifies the string to be matched.
MatchVarname (STRPTR)
specifies the name of the UMS config string.
And there are some optional tags:
MatchGlobalOnly (none)
only use a global config string.
MatchUser (STRPTR)
use a config string local to another user. The name (or alias)
of that user must be given.
MatchDefault (LONG)
a value that will be returned, if the specified config string
cannot be found, or any other type of error occurs.
RESULT
match - the result of the pattern matching. The value of tag
MatchDefault or zero if an error occured.
SEE ALSO
UMSReadConfig()
ums.library/UMSReadConfig ums.library/UMSReadConfig
NAME
UMSReadConfig -- Read an element from UMS' configuration.
SYNOPSIS
string = UMSReadConfig( login, tags )
D0 D2 D3
STRPTR UMSReadConfig( UMSAccount, struct TagItem * );
string = UMSReadConfigTags( login, tag1, ... )
STRPTR UMSReadConfigTags( UMSAccount, ULONG, ... );
FUNCTION
Read an object from UMS' configuration.
Whenever possible, applications should use the UMS configuration
(as stored in the file 'ums.config' in the directory of the
message-base) and the supplied functions UMSReadConfig() and
UMSWriteConfig() instead of own special config-files.
A 'config-string' is a null-terminated string identified by an
unique name. Similar to shell- and environment-variables
config-strings can be global (same for all users) or local (only
visible to a certain user).
Other config-objects are 'users' (with aliases and local
strings), 'akas' and 'netgroups'.
In order not to mix up config-strings of different applications,
their names should have the id of the application and a dot
prepended. E.g. "fido.outbound", "fido.inbound", "uucp.uuspool",
"IntuiNews.QuoteChars.foo.bar", "ConfUMS.ForceDelete" etc.
Names without a dot (".") are considered private strings of the
MBP, e.g. "READACCESS", "WRITEACCESS".
Names for config elements are case-insensitive.
This function buffers the returned string until it is freed with
UMSFreeConfig() or (UMSLogout()).
INPUTS
The following tags are allowed:
CfgGlobalOnly (none)
read just global config-elements, ignore local ones.
CfgUser (STRPTR)
read config elements local to another user. You must specify
the name of the other user here. This contradicts CfgGlobalOnly
(see above)!
CfgLockVar (LONG, V11)
using this tag you may preserve the config string from being
modified by another login, i.e. another UMS program. Set the
tag's data to 1 if you want to do so, otherwise use 0 (or do not
use this tag) to not lock the variable. Be careful to unlock the
variable if you do not need it anymore using UMSWriteConfig()'s
tags CfgUnlockVar! This tag is useful only in conjunction with
CfgName (see below).
CfgQuoted (LONG, V11)
read the variable in quoted format, as used in "ums.config".
This enables you to mix the variable's data with macros. Set the
tag's data to 1 if you want to use the quoted format, otherwise
set it to 0 (or do not use this tag).
The following tags are mutually exclusive. Use exactly one of
them.
The CfgNext-tags allow you to scan all the existing elements of
one type and do all work in the same manner: On first invocation
you set the tag's data to NULL and get the first element. With
every further call, you set it to what has been returned on the
previous call. When NULL is returned, you're done.
CfgName (STRPTR)
read a config-string with given name.
CfgUserName (STRPTR)
get the 'realname' for a user with a given alias.
CfgNextVar (STRPTR)
get the name of the next config variable. This tag must be
combined with tag CfgGlobalOnly or tag CfgUser (see above).
CfgNextAlias (STRPTR, V11)
get the next alias. This tags may be combined with CfgUser
(see above)
CfgNextUser (STRPTR, V11)
get the 'realname' of the next user.
CfgNextExporter (STRPTR, V11)
get the name of the next exporter.
CfgNextGroup (STRPTR)
get the name of the next netgroup. Any number of groupnames
may be configured as identical 'netgroups'. Use this tag to scan
all netgroups, to scan their members use CfgNextGroupMember (see
below).
CfgNextGroupMember (STRPTR, V11)
get the name of the next member of a specific netgroup. Using
this tag repeatedly you can cycle trough all groups belonging to
the same netgroup. Members of netgroups are organized in a
circular structure, so you'll have to compare the original
string with every result to determine whether you're done. NULL
is returned only if the given string doesn't indicate a valid
netgroup-member.
RESULT
string - a pointer to the desired config element or NULL.
SEE ALSO
UMSFreeConfig(), UMSWriteConfig()
ums.library/UMSReadMsg ums.library/UMSReadMsg
NAME
UMSReadMsg -- Read (parts of) a message.
SYNOPSIS
success = UMSReadMsg( login, tags )
D0 D2 D3
BOOL UMSReadMsg( UMSAccount, struct TagItem * );
success = UMSReadMsgTags( login, tag1, ... )
BOOL UMSReadMsgTags( UMSAccount, ULONG, ... );
FUNCTION
Read a message or any parts of it.
INPUTS
The following tags are allowed:
RMsgNum (LONG)
specify which msg to read. This tag MUST be used!
RHeaderLength (LONG*)
you have to pass a pointer to a LONG here. This LONG will be
set to the length of the message-header in bytes. I.e. the
length of all text-fields considered to belong to the 'header'
of a message.
RTextLength (LONG*)
like RHeaderLength, but the length of the message-text. These
are all other fields.
RMsgDate (LONG*)
the date the message has been written to the message-base
(also referred to as the 'receive-date'). In AmigaDOS Format
(seconds since 1.1.1978).
RChainUp,
RChainDn,
RChainLt,
RChainRt (LONG*)
reply-chaining. Since a message can only refer to one other
(older) message, but have multiple other (newer) messages
referring to it, a tree is built out of this 'comment-chaining'.
ChainUp points to the referred message. ChainDn points to one of
the messages that comment on the current one. ChainLt and
ChainRt point to other messages which share the same ChainUp.
The LONG you supply a pointer to in the tag's data will either
be set to zero (when there is no such chain) or to the number of
a message.
RGlobalFlags (LONGBITS*)
global flags for this message. In the MB every message has
exactly one set of global flags. See <ums.h> for the meaning of
these flags.
RUserFlags (LONGBITS*)
user-flags for this message. Every user of the MB has one set
of user-flags for each message. See <ums.h> for the fixed or
suggested meanings of these flags.
RLoginFlags (LONGBITS*)
login-flags for this message. Every login has a private set of
flags for each message. In contrast to global or user-flags,
login-flags are NOT saved and vanish on UMSLogout(). They are
set to zero on UMSLogin().
RHardLink,
RSoftLink (LONG*)
you supply a pointer to a LONG that will be set to the message
number of the next hard- or softlink in the circular linked list
of messages. The LONG will be set to zero, if there are no links
of the respective type to this message. Note that message-links
can either be hard or soft, but not both a the same time! So
only one of HardLink or SoftLink can be non-zero.
RDateStyle (LONG)
use this tag and set its data to 1 if you want to get an
old-style 'receive-date'. Don't use this tag or set its data to
zero otherwise.
RMsgText, ..
RMsgText + 127 (STRPTR*)
tell UMS that you want to read the specified text-field and
supply a place for a pointer to it. This will be set to NULL if
the field doesn't exist or you're not allowed to read it.
RTextFields (UMSMsgTextFields)
if you supply a pointer to an array of UMSNUMFIELDS STRPTR
here, it will be set to the read text-fields. Useful for reading
a whole message without having to specify a tag for each
possible text-field.
RReadHeader (none)
tell UMS that you want to read all header-field. Useful in
combination with RTextFields only.
RReadAll (none)
tell UMS that you want to read the message-text, too. Useful
in combination with RTextFields only.
The following tag was not implemented in ums.library until
V9.70!
RIDStyle (LONG)
choose the style of local message IDs. There are two possible
formats of 'local' message IDs (= the IDs created by the local
system):
a) a simple decimal number that is unique on the local
system
b) this decimal number followed by "@" and the domain-
address of the local system. This conforms with
RFC822/1036.
Old (obsolete) Version of ums.library (< V9.70) still use
format a), but since V9.70 versions use format b) in order to
make things cleaner and make life easier for exporters. With
format a) exporters must append the domain-address to IDs
themselves, with format b) they needn't care about whether an ID
is local or not.
As an interim solution this tag allows to specify the desired
format. Its data set to 1 forces format a), 0 (default) forces
format b).
RNoUpdate (LONG)
when reading its message-text, a message is usually updated by
having its 'Old'-flag set in your user-status. If you don't want
the Old-flag to be set, use this tag and set its data to 1.
RNextFileName,
RNextTempFileName (STRPTR*)
These tags allow you to scan all existing elements of the field
UMSCODE_FileName or UMSCODE_TempFileName. On first invocation you
set the tag's data to NULL and get the first element. With every
further call, you set it to what has been returned on the previous
call. When NULL is returned, you're done.
RESULT
success - whether your attempt to read the message was successful
or not.
NOTES
The message will be buffered, so you can easily use all the
returned STRPTRs. You have to use UMSFreeMsg() to free the buffers
allocated for a certain message.
The string obtained by UMSReadMsg() are private copies for you -
though not recommended, you may even overwrite them, but _never_
beyond the teminating zero-byte. UMSFreeMsg() still wroks if
strings are modified.
An user or exporter usually wants to read a single message only
once.
To make this easy, UMSReadMsg() checks whether the user reads
the 'MsgText' of a message, and, if so, sets the 'Old'-Flag in the
users status if it wasn't already set.
So the user (or exporter) only needs to ask for this flag to be
unset when using 'UMSSearch()' before 'UMSReadMsg()' and will
automatically avoid reading the same message a second time.
SEE ALSO
UMSFreeMsg(), UMSSearch()
ums.library/UMSRLogin ums.library/UMSRLogin
NAME
UMSRLogin -- Obtain a login for access to a message base
SYNOPSIS
login = UMSRLogin(server, user, passwd)
D0 D2 D3 D4
UMSAccount UMSRLogin(STRPTR, STRPTR, STRPTR);
FUNCTION
This function is used to get access to an UMS message base. If
necessary the UMSServer is launched first.
This function returns a handle which is used internally to track
and remember the resources associated with each login. If an user
tries to login multiple times this handle will be different each
time. A login may be used only by the process which created it
UMSRLogin(). Zero on failure, any other value indicates success.
INPUTS
server - Name of the message base
user - Name or 'alias' of an user
passwd - The password of the user. A pointer to the null-string is
allowed, NULL itself isn't.
RESULT
login - Handle number if successful or Zero on failure
EXAMPLE
UMSAccount login = UMSRLogin("TestServer", "SysOp", "secret");
NOTE
Never forget to call UMSLogout()!
Use this function instead of UMSLogin() for new programms.
SEE ALSO
UMSLogin(), UMSLogout()
ums.library/UMSSearch ums.library/UMSSearch
NAME
UMSSearch -- Search a message from the MB.
SYNOPSIS
msgNum = UMSSearch( login, tags )
D0 D2 D3
LONG UMSSearch( UMSAccount, struct TagItem * );
msgNum = UMSSearchTags( login, tag1, ... )
LONG UMSSearchTags( UMSAccount, ULONG, ... );
FUNCTION
Search the first (or next) message in the MB that fulfils
certain criteria.
When you want to read certain messages from the MB, it is
recommended that you first select these messages with UMSSelect()
and then alternately use UMSSearch() and UMSRead() to get all
these messages.
INPUTS
Allowed tags:
SearchLast (LONG)
specify the last message NOT to search. This tag allows you to
cycle trough all messages fullfilling the same criteria: set
this to zero and invoke UMSSearch() the first time. Check the
result and if it's not zero, put it in this tag and invoke
UMSSearch() again. Repeat this until it returns zero.
SearchDirection (LONG)
set the search direction. 1 means search forward (to higher
numbers), -1 means search backwards (to lower numbers) and 0
lets the MBP decide what sequence to use. This needn't be
exactly forwards or backwards. It might be in a completely
different order.
When you don't depend on a certain search-direction, use 0 or
omit this tag.
SearchGlobal (none)
SearchLocal (none)
SearchUser (STRPTR)
SearchMask (LONGBITS)
SearchMatch (LONGBITS)
search for a matching status; like SelReadGlobal,
SelReadLocal, SelReadUser, SelMask and SelMatch with
UMSSelect().
WMsgText, ..
WMsgText + 127 (STRPTR)
search for a matching text; as for UMSSelect(). Only one field
can be searched for at a time.
SearchQuick (none)
Enable 'quick-search'. This must be combined with exactly one
of WMsgText+1 .. WMsgText+31. quick-searches are possible for
exact string searches only, they must not be combined with
patterns and they are only possible for fields that have an
index.
They don't guarantee that the returned message's field
actually matches the given string, altough mistakes are very
unlikely.
But they are fast! (see NOTES below)
SearchPattern (LONG)
indicate whether the string to be searched for is an exact
string (0), an AmigaDOS pattern (1) or UMS should try to find
out (2).
RESULT
msgNum - numer of a/the searched message; zero if not found.
NOTES
Although LONGBITS are used in the definition, the current
implementation only uses/supports the lower 16 bits.
Performance: when searching for strings, different calls to
UMSSearch() may significantly vary in performance. There are
three general possibilities:
1) quick-searches:
very fast, no access to the hard-disk needed (once the
right index is loaded into memory). Only possible if tag
'SearchQuick' specified.
2) indexed searches:
fast, in most cases only one, short access to hd is needed;
a few more in really bad situations. If the 'header'-file is
sufficiently buffered, no accesses to the hd may occur.
Possible if searching for exact strings in indexed fields.
3) other searches (non-indexed or patterns):
slow, many data will have to be read from hd. If the field
searched for is in the 'header'-file and it's heavily
buffered, no accesses to the hd may occur. Nevertheless the
search will consume much CPU-time.
Search for status!!!
Searching for a matching status only (i.e. not searching for a
string) is always very fast.
When doing non-indexed- or pattern-search, combine with status
to reduce the amount of data to be searched through!
SEE ALSO
UMSSelect(), UMSReadMsg(), <ums.h>
ums.library/UMSSelect ums.library/UMSSelect
NAME
UMSSelect -- Select messages.
SYNOPSIS
count = UMSSelect( login, tags )
D0 D2 D3
LONG UMSSelect( UMSAccount, struct TagItem * );
count = UMSSelectTags( login, tag1, ... )
LONG UMSSelectTags( UMSAccount, ULONG, ... );
FUNCTION
Select messages in the MB according to various criteria. To
'select' here means to set or unset some flags, which then can be
used by UMSSearch(), stored, or transferred to another user.
UMSSelect() can only do one operation upon every invocation.
An operation usually looks for all messages that fullfill the
specified criteria and then selects them in a specified way.
When you want to select messages by different, logically
combined criteria, you may need to call UMSSelect() more than once
and use some temporary flags. However, very few calls to this
functions usually should suffice.
INPUTS
The following tags control the selection of messages. Thus,
they somehow specify the 'output' of the select operation.
SelWriteGlobal (none)
manipulate global flags on the selected messages.
SelWriteLocal (none)
manipulate your local login-flags.
SelWriteUser (STRPTR)
manipulate another user's user-flags. You must specify the
users name (or alias).
SelWriteGlobal, SelWriteLocal and SelWriteUser are mutually
exclusive -- you can manipulate only one flag-table at a time.
When specifying none of these tags, your user-flags will be
manipulated as default.
SelSet,
SelUnset (LONGBITS)
on each selected message the 'SelUnset' flags are cleared and
then the 'SelSet' flags are set. ['status = (status & ~unset) |
set;']
When writing global- or user-flags, you are not allowed to
manipulate all possible flags. See <ums.h> for protected flags.
The following tags control what and how messages are selected,
the 'input' and 'modes' of the select operation.
SelStart,
SelStop (LONG)
Limit the number of messages to be processed. The select
operation will start with the message indicated by 'SelStart'
and stop before the 'SelStop' message. In other words, start is
included and stop is excluded.
(0 < start <= messages to be processed < stop)
This was different and partly buggy in MBP versions prior to
V10.16.
If no 'SelStart' is specified, the operation starts with the
first message; if no 'SelStop' is specified, the operation stops
at the last existing message.
The following operations are mutually exclusive:
1) select by status
SelReadGlobal (none)
SelReadLocal (none)
SelReadUser (STRPTR)
like SelWriteGlobal, SelWriteLocal, SelWriteUser, but specifys
which flags to look at. Again, your user-flags are the default.
SelMask,
SelMatch (LONGBITS)
specify a mask and a match. If (status & mask) == match
[status * mask = match], the message will be selected.
SelParent (none)
with this tag specified, each message's 'parent' (reference;
-> reply-chaining) will be inspected instead of its own status.
SelMaxCount (LONG)
this tag specifies a maximum number of messages to select.
Even if there are more message with matching status, only that
much of them will be selected. Selects are done backwards, i.e.
you'll get the last N matching messages.
SelMaxSize (LONG)
this tag specifies a maximum size for all selected messages.
When selecting (from the end of the MB towards the beginning),
the selected messages sizes are summed up. If the sum exceeds
the specified number bytes, the operation stops.
2) select by date
SelDate (LONG)
the messages' dates are compared with the supplied date (in
seconds since 1.1.1978) and only the younger ones will be
selected.
3) select by creation date
SelCDate (LONG)
the messages' creation dates are compared with the supplied
date (in seconds since 1.1.1978) and only the younger ones will
be selected.
NOTE: binary creation date is an optional field. Only those
messages that have this field can be selected whit this
function!
4) select a tree
SelTree (LONG)
you must specify the number of a message here. Then all
messages being in the same reply-tree will be selected.
5) select a sub-tree
SelSubTree (LONG)
like SelTree, but only the subtree (the one with the specified
message as its root) is selected.
6) select a single message
SelMsg (LONG)
select only the specified message.
7) select by text
WMsgText, ..
WMsgText + 127 (STRPTR)
when you specify one of these tags, the function selects all
messages which have the supplied string in the specified field.
The strings are compared case-INsensitive.
SelQuick (none)
when this tag is specified, 'quick-search' is enabled for
selecting texts. This means that only some CRCs on the texts are
compared. This makes it possible to select also some wrong
messages. Yet, due to the usage of 32-bit CRCs, the probability
of selecting wrong messages is VERY low, you most likely will
never experience this case.
As 'quick-search' does not usually need to access mass-
storage, it is VERY FAST.
8) select by size
SelSize (LONG)
the messages' sizes are compared with the supplied number
(bytes) and only biggers ones will be selected.
RESULT
count - how many messages have been selected. Zero, when no
message has been selected or an error has occured.
EXAMPLE
See SelectMail.c for examples on how to use this function.
NOTES
Although LONGBITS are used in the definition, the current
implementation only uses/supports the lower 16 bits.
SEE ALSO
UMSSearch(), <ums.h>
ums.library/UMSServerControl ums.library/UMSServerControl
NAME
UMSServerControl -- control the UMS server.
SYNOPSIS
error = UMSServerControl(server, action)
D0 D2 D3
UMSError UMSServerControl (STRPTR, LONG);
FUNCTION
This function does not take an UMS account as parameter, but
simply the name of the server to address and an integer number for
the action to the server is expected to perform. It "annonymously"
controls the global behaviour of the server.
The following actions are available:
1 = CleanUp
Start the cleanup procedure, reorganizing the whole MB,
physically deleting deleted and expired messages and freeing
space on the HD. This procedure is critical, since the MB will
be corrupted if the procedure is interrupted (by system failure,
power-off, reboot, ..). Always make of backup of the MB before
starting a cleanup! A cleanup is not possible if there are valid
logins, since all message-numbers are changed.
2 = Flush
Flush all buffers.
3 = Quit
Terminate the server. If there still are logins, the server
might pop up a requester to ask whether to quit or to continue.
4 = QuitForce
Really terminate the server, no matter how many users still
need it. No requester.
5 = Ping
Test whether the addressed server is running.
6 = LockCfg
Globally lock the UMS configuration against changes.
7 = UnlockCfg
Release a lock optained with LockCfg. You should use LockCfg
before and UnlockCfg after editing the file "ums.config" while
the server is running.
INPUTS
server - name of the UMS server to control.
action - number of action to perform.
RESULT
error - error number.
SEE ALSO
UMSErrTxt(), UMSErrNum()
ums.library/UMSWriteConfig ums.library/UMSWriteConfig
NAME
UMSWriteConfig -- Write an element to the UMS' configuration.
SYNOPSIS
success = UMSWriteConfig( login, tags )
D0 D2 D3
BOOL UMSWriteConfig( UMSAccount, struct TagItem * );
success = UMSWriteConfigTags( login, tag1, ... )
BOOL UMSWriteConfigTags( UMSAccount, ULONG, ... );
FUNCTION
Create or modify elements of UMS' configuration.
INPUTS
The following tags are allowed:
(Note: talking about a 'user' means exporters and sysops as
well.)
CfgData (STRPTR)
this tag's data holds the contents of the variable to be
written. Use this tag in conjunction with CfgName (see below).
CfgUser (STRPTR)
name of the user whose local configuration should be changed.
E.g. create a new alias or variable belonging to the specified
user etc.
CfgGlobalOnly (none)
change an element of the global configuration area being
readable by all users.
CfgQuoted (LONG, V11)
to store the variable's data in quoted format, allowing to mix
the data and macro definitions, set the tag's data to 1
otherwise set it to 0 (or do not use this tag).
CfgLocal (none, V11)
use this tag to create or delete variables that are only valid
with the current login, disappearing after UMSLogout(). This way
you can easily use UMSMatchConfig() without actually modifying
the "ums.config".
CfgUnlockVar (LONG, V11)
use this tag to unlock a variable locked by calling
UMSReadConfig() with the CfgLockVar tag allowing "public" access
again. Set the tag's data to 1 to unlock and store the variable
and its data, set it to 2 to just unlock the variable without
actually saving it and set it to 0 (or don't use this tag) to
not care about the current locking state of the variable.
The following tags are mutually exclusive. Use exactly one of
them.
CfgName (STRPTR)
Name of the config variable to be changed. If a variable of
the given name does not exist it will be created. To remove a
variable from the configuration do not specify a tag CfgData
(see above).
CfgDump (STRPTR)
write the current settings to a file with given name.
CfgCreateAlias (STRPTR, V11)
create a new alias of the given name for the user specified by
the CfgUser tag (see above).
CfgDeleteAlias (STRPTR, V11)
remove the alias of the given name from the user specified by
the CfgUser tag (see above).
CfgCreateExporter (STRPTR, V11)
create a new export user with the given name.
CfgCreateSysop (STRPTR, V11)
create a new user with sysop-privilegs with the given name.
CfgCreateUser (STRPTR, V11)
create a new user with the given name.
CfgDeleteUser (STRPTR, V11)
remove the user with the given name from the configuration
deleting her local variables as well.
CfgAddNetGroup,
CfgNetGroup (STRPTR, V11)
add a netgroup entry. These two tags must be used together,
each naming one group. These two groups then are considered to
the of the same "netgroup". If there are more than two named for
the same netgroup, repeat this function for each additional
groupname, setting CfgNetGroup to the name of an already
existing group.
CfgDeleteNetGroup (STRPTR, V11)
delete a netgroup entry. The named group will be removed from
the configuration.
RESULT
success - whether it was possible and allowed to make the desired
write or change.
SEE ALSO
UMSReadConfig()
ums.library/UMSWriteMsg ums.library/UMSWriteMsg
NAME
UMSWriteMsg -- write a message to the UMS message base.
SYNOPSIS
msgNum = UMSWriteMsg( login, tags )
D0 D3 D3
LONG UMSWriteMsg( UMSAccount, struct TagItem * );
msgNum = UMSWriteMsgTags( login, tag1, ... )
LONG UMSWriteMsgTags( UMSAccount, ULONG, ... );
FUNCTION
Writes a message to the UMS message base. This may be either a
new message to create or an already existing message to be
changed.
The MBP checks correctness of the message and the users
write-access concerning this message before writing it. It also
performs dupe-checking, tries to link to a tree of reply-chains,
creates all desired indices and computes the other users'
read-access to this message.
All the components of the message as well as information on how
to do it are supplied as AmigaDOS compatible TagItems.
INPUTS
The following tags are allowed:
WMsgText, ..
WMsgText + 127 (STRPTR)
specify a certain text-field.
A text fields is always one null-terminated string. Read the
separate documantation to see what fields and what formats of
these fields are allowed.
A certain text-field (identified by its tag) may only appear
once in a message. If a field is specified more than once in the
tag list, only the latest will be used.
WTextFields (UMSMsgTextFields)
specify more than one text-field. This points to an array of
UMSNUMFIELDS string-pointers. All fields you don't want to
specify have to be NULL in this array.
WMsgNum (LONG)
when you want to change an old message, you must use this tag
to specify the number of the message to change. Don't use this
tag when you just want to create a new message.
WMsgDate (LONG)
this has a very special meaning. Specifying an AmigaDOS
compatible date (seconds since 1.1.1978) with this tag indicates
that you want to restore an old message from a backup rather
than writing a new one. All users will have the 'old' flag set
and not get this message as a new one when this tag is used.
WChainUp (LONG)
in some cases it might be unsure or impossible for the MBP to
build the correct reply-chain for a message. Use this tag to
specify the number of the old message that is referred to by the
new one.
WHardLink,
WSoftLink (LONG)
Writing a message with a Message-ID that already exists in the
MB usually will lead to the detection of a 'dupe'. Yet in some
cases it is necessary for UMS to allow multiple messages with
the same Message-ID.
This is made possible by the concept of message-'links'. With
this concept, multiple messages sharing the same Message-ID (and
perhaps some more fields) are organized in a circular linked
list. To create such a linked list, you just write its first
message as usual and remember its number. Then you write the
other messages using one of the above tags to specify the number
of the original message (or any of the already linked messages).
The MBP may optimize storage space for message links by only
storing the fields that differ between the fields and the
original message. Nevertheless you always have to specify the
whole message to write a link and you will always get the
complete message when reading a link.
All links to a message must consist of the same fields as the
original message, but the contents of the fields may differ.
There are two sorts of message-links, hardlinks and softlinks.
Softlinks describe messages that have some fields in common (at
least MsgID), but are really treated as individual messages.
E.g. a mail with multiple receipients. Hardlinks, on the other
hand, are treated as one message wherever possible. I.e. if you
read one hardlinked message, all the other links will be marked
as old, too. RFC crosspostings, for instance, should be made
hardlinks.
WAutoBounce (LONG)
If the msg to be written is addressed to a local user that
doesn't exist or to an address that no exporter can export,
there are two possible behaviours possible for the MBP:
a) reject the message using error-no "NoReader", expecting the
client to care about the undeliverable message
b) keep the message, forwarding it to the local sysop or some
kind of 'bounce-daemon', so that the writing client needs
not to care about the message any more.
This tag allowes to specify the desired behaviour, data=0
forces a), data=1 forces b). If this tag is not specified, the
MBP will choose the behaviour as it wishes, maybe depending on
whether the writing user is an exporter or not.
WHide (LONG)
In some cases it might be desirable to write a message that
can only by read by exporters and not by simple users, or the
other way round.
For instance control-messages that are of no interest to users
by must be distributed over the net.
Setting data to 0 is the same as the default. data=1 means
that only exporters may view and read the message, data=2 makes
the message invisible to exporters and only accessible to simple
users.
WHdrFill,
WTxtFill (LONG)
specify how many bytes to reserve for later changes in the
header/text of the message.
The MBP may not be able to change an existing message if the
change would increase the overall size (maybe after compression)
of the message. Since such changes are neccessary in some
special cases, the MBP can be told to reserve some space when
writing a message the first time.
Reserving more than actually needed is not a good idea, since
it decreases performance and wastes space. The writer of a
message usually should know whether or not he will change the
message later on and to what extend he will increase the size of
the message.
WNoUpdate (LONG)
when writing a message, the 'Old'-flag in your user-status for
the new message will usually be set. If you don't want this, use
this tag and set its data to 1.
WCheckHeader (LONG)
if you just want to check whether the MBP would likely accept
a message but you don't yet have the complete body of the
message, you can use this tag und set its data to 1: nothing is
actually written to the MB. If the supplied message-header seems
to be ok, -1 will be returned as a "fake" message number. Then
you can get the messages body (e.g. transfer it over a network)
and write the message with removing this tag of just setting its
data to 0.
RESULT
msgNum - Number of the written message or NULL on failure.
NOTES
Changing an old message:
You must _always_ give a complete message to UMSWriteMsg(), even
when changing an old one! The MBP needs this to detect all changes
made to the old message, including changed, added or deleted
fields. Thus you need to read a message prior to changing it. Use
RTextFields and WTextField for UMSReadMsg() and UMSWriteMsg() when
changing an old message! Otherwise you will lose fields unknown to
your application that might be still important to other
applications!
You may not be allowed to change certain fields of an existing
message. Most likely those fields that are used by the MBP to
compute all the users access-rights will be prohibited to change.